Перейти к основному содержимому

5.03. Иерархия исключений в Java

Разработчику Архитектору

Иерархия исключений в Java

В Java все исключения являются объектами, наследующими от класса java.lang.Throwable. Иерархия ошибок строго типизирована и разделена на две основные ветви: исключения (Exception) и ошибки (Error). Обе наследуются от Throwable.


Иерархия исключений в Java (актуально для Java 17–21, стандартная библиотека)

Корневой класс:

  • java.lang.Throwable

Основные подклассы Throwable:

  1. java.lang.Error — указывает на серьёзные проблемы, которые обычно не следует обрабатывать (например, сбои виртуальной машины).
  2. java.lang.Exception — базовый класс для всех обрабатываемых исключений.

1. Подклассы java.lang.Error (не предназначены для перехвата в обычном коде)

  • AssertionError
  • LinkageError
    • BootstrapMethodError
    • ClassCircularityError
    • ClassFormatError
      • UnsupportedClassVersionError
    • IncompatibleClassChangeError
      • AbstractMethodError
      • IllegalAccessError
      • InstantiationError
      • NoSuchFieldError
      • NoSuchMethodError
      • VerifyError
    • NoClassDefFoundError
    • UnsatisfiedLinkError
  • OutOfMemoryError
  • StackOverflowError
  • VirtualMachineError
    • InternalError
    • OutOfMemoryError
    • StackOverflowError
    • UnknownError

Примечание: OutOfMemoryError и StackOverflowError наследуются от VirtualMachineError, который, в свою очередь, наследуется от Error.


2. Подклассы java.lang.Exception

2.1. Проверяемые исключения (checked exceptions) — обязательны к обработке или объявлению

  • ClassNotFoundException
  • CloneNotSupportedException
  • IllegalAccessException
  • InstantiationException
  • InterruptedException
  • NoSuchFieldException
  • NoSuchMethodException
  • ReflectiveOperationException (родитель для нескольких рефлексивных исключений)
    • ClassNotFoundException
    • IllegalAccessException
    • InstantiationException
    • InvocationTargetException
    • NoSuchFieldException
    • NoSuchMethodException
  • IOException (и множество подклассов)
    • EOFException
    • FileNotFoundException
    • InterruptedIOException
      • SocketTimeoutException
    • MalformedURLException
    • ProtocolException
      • HttpRetryException
      • UnknownServiceException
    • SecurityException (примечание: см. ниже)
    • SyncFailedException
    • UnknownHostException
    • URISyntaxException
    • и др. (более 50 подклассов в java.io, java.net, java.nio)

Примечание: SecurityException технически наследуется от RuntimeException, несмотря на название.

2.2. Непроверяемые исключения (unchecked exceptions) — наследуются от RuntimeException

  • ArithmeticException
  • ArrayIndexOutOfBoundsException
  • ArrayStoreException
  • BufferOverflowException
  • BufferUnderflowException
  • ClassCastException
  • ConcurrentModificationException
  • IllegalArgumentException
    • NumberFormatException
    • IllegalFormatException
  • IllegalCallerException
  • IllegalMonitorStateException
  • IllegalStateException
  • IndexOutOfBoundsException
    • ArrayIndexOutOfBoundsException
    • StringIndexOutOfBoundsException
  • NegativeArraySizeException
  • NullPointerException
  • SecurityException
  • StringIndexOutOfBoundsException
  • TypeNotPresentException
  • UnsupportedOperationException

Важные особенности:

  • Проверяемые исключения (checked) — все подклассы Exception, кроме RuntimeException и его потомков. Компилятор требует их обработки (try-catch) или объявления в сигнатуре метода (throws).
  • Непроверяемые исключения (unchecked) — RuntimeException и его подклассы, а также все Error. Не требуют явной обработки.
  • Исключения из пакетов java.util, java.lang, java.time и т.д. обычно непроверяемые.
  • Многие исключения в java.io и java.net — проверяемые.

Как получить список программно (ограничения):

Java не предоставляет простого способа перечислить все встроенные исключения, так как они распределены по разным пакетам (java.lang, java.io, java.net, java.util.concurrent и др.). Однако можно использовать reflection для анализа загруженных классов, но это не гарантирует полноты без сканирования всех JAR-файлов JDK.